import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
import numpy as np
from util import preprocess_image, load, get

# 读取配置信息
char_styles = get('char_styles')  # 字体样式列表
new_size = get('new_size')  # 新尺寸大小元组
model_path = f'{get("model_root")}/best_model'  # 模型路径


class ImageClassifierApp:
    def __init__(self):
        # 使用util.load加载最佳模型
        self.model = load("最好的F1分数的模型", model_path)

        # 创建主窗口
        self.root = tk.Tk()
        self.root.title('Image Classifier')
        self.root.geometry("300x200")

        # 创建一个按钮用于选择图像
        self.select_button = tk.Button(self.root, text='选择图像', command=self.select_image)
        self.select_button.pack()

        # 创建一个标签用于显示图像
        self.image_label = tk.Label(self.root)
        self.image_label.pack()

        # 创建一个标签用于显示预测的类别
        self.prediction_label = tk.Label(self.root)
        self.prediction_label.pack()

        # 启动GUI事件循环
        self.root.mainloop()

    def select_image(self):
        # 打开文件对话框以选择图像
        image_path = filedialog.askopenfilename()

        # 使用util的preprocess_image函数预处理图像
        image = Image.open(image_path).convert('L')  # 打开图像并将其转换为灰度图像
        image = preprocess_image(image, new_size)  # 对图像进行预处理
        image = np.expand_dims(image, axis=0)  # 将图像增加一个维度

        # 使用加载的最佳模型执行推理
        predicted_class = self.model.predict(image)

        # 将图像大小调整为指定大小
        pil_image = Image.open(image_path).resize((200, 200), Image.ANTIALIAS)

        # 将PIL图像转换为PhotoImage并更新标签
        image_tk = ImageTk.PhotoImage(pil_image)
        self.image_label.config(image=image_tk)
        self.image_label.image = image_tk

        # 更新预测标签
        predicted_style = char_styles[predicted_class[0]]
        self.prediction_label.config(text=f'预测类别: {predicted_style}')


# 启动应用程序
app = ImageClassifierApp()
